<?php
namespace App\Manager;
use App\Manager\Storage;

/**
 * 帧管理类
 */
class FrameManager extends BaseManager
{
    const PER_FIX = 'FRAME:';

    /**
     * 获取某一个房间的某一个对象的所有帧
     * 如果redis中存在，则读取redis，若不存在则读取 db或file
     * @param key string 
     * @param data array
     */
    public function getData($key)
    {
        // 如果缓存中没有，则从磁盘中读取
        return $this->getStorage()->exists(self::PER_FIX . $key) ? 
                    $this->getStorage()->loadList(self::PER_FIX . $key) : 
                    $this->loadFromDb($key);
    }

    /**
     * 插入数据
     * @param key string 
     * @param data string
     * @return result bool
     */
    public function append($key, $data)
    {
        $data = is_string($data) ? $data : json_encode($data);
        return false === $data ?
                    false :
                    $this->getStorage()->rpush(self::PER_FIX . $key, $data);
    }

    /**
     * 将数据保存到硬盘，并删除缓存数据
     * @param key string
     * @return result bool
     */
    public function saveAndClean($key)
    {
        return $this->save($key) 
                    && $this->clean($key);
    }

    /**
     * 将数据保存到硬盘
     * @TODO
     * @param key string
     * @return result bool
     */
    public function save($key)
    {
        $data = $this->getStorage()->loadList(self::PER_FIX . $key);
        $content = $this->transData($data);
        // 数据库保存
    }

    /**
     * 删除缓存数据
     * @param key string
     * @return result bool
     */
    public function clean($key)
    {
        return $this->getStorage()->remove(self::PER_FIX . $key);
    }

    public function undo($key, $data)
    {
        foreach ($data as $v)
        {
            $this->getStorage()->lrem(self::PER_FIX . $key, json_encode($v), -1);
        }
        return $this->getStorage()->loadList(self::PER_FIX . $key);
    }

    /**
     * 对数据进行转化后存储
     * 单独提取是因为方便后期通过算法优化压缩率
     * 提高性能
     */
    public function transData($data)
    {
        return json_encode($data);
    }

    /** 
     * 从硬盘中读取数据后放到redis中
     */
    public function load($key)
    {
        $data = $this->loadFromDb($key);
        $this->clean($key);
        foreach ($data as $v)
        {
            $this->getStorage()->rpush(self::PER_FIX . $key, $v);
        }
        return $data;
    }

    public function loadFromDb()
    {
        return [];
    }
}